"""
Markdown 转 HTML 工具
使用 Python 标准库实现，支持代码高亮标记
"""

import re
import html


def escape_html(text: str) -> str:
    """转义 HTML 特殊字符"""
    return html.escape(text)


def markdown_to_html(markdown_text: str) -> str:
    """
    将 Markdown 转换为 HTML
    支持：代码块、行内代码、标题、粗体、斜体、链接、列表等
    
    Args:
        markdown_text: Markdown 文本
        
    Returns:
        HTML 字符串
    """
    if not markdown_text:
        return ''
    
    try:
        html_lines = []
        lines = markdown_text.split('\n')
        i = 0
        in_code_block = False
        code_block_lines = []
        code_lang = ''
        in_list = False
        
        while i < len(lines):
            line = lines[i]
            
            # 处理代码块
            if line.strip().startswith('```'):
                if not in_code_block:
                    # 开始代码块
                    in_code_block = True
                    code_lang = line.strip()[3:].strip()
                    code_block_lines = []
                else:
                    # 结束代码块
                    in_code_block = False
                    code_content = '\n'.join(code_block_lines)
                    code_content = escape_html(code_content)
                    
                    if code_lang:
                        html_lines.append(f'<pre><code class="language-{code_lang}">{code_content}</code></pre>')
                    else:
                        html_lines.append(f'<pre><code>{code_content}</code></pre>')
                    
                    code_block_lines = []
                    code_lang = ''
                i += 1
                continue
            
            if in_code_block:
                code_block_lines.append(line)
                i += 1
                continue
            
            # 空行
            if not line.strip():
                if in_list:
                    html_lines.append('</ul>')
                    in_list = False
                html_lines.append('<br>')
                i += 1
                continue
            
            # 标题
            heading_match = re.match(r'^(#{1,6})\s+(.+)$', line)
            if heading_match:
                level = len(heading_match.group(1))
                content = process_inline(heading_match.group(2))
                html_lines.append(f'<h{level}>{content}</h{level}>')
                i += 1
                continue
            
            # 无序列表
            list_match = re.match(r'^[-*]\s+(.+)$', line)
            if list_match:
                if not in_list:
                    html_lines.append('<ul>')
                    in_list = True
                content = process_inline(list_match.group(1))
                html_lines.append(f'<li>{content}</li>')
                i += 1
                continue
            
            # 有序列表
            ordered_list_match = re.match(r'^\d+\.\s+(.+)$', line)
            if ordered_list_match:
                if not in_list:
                    html_lines.append('<ol>')
                    in_list = True
                content = process_inline(ordered_list_match.group(1))
                html_lines.append(f'<li>{content}</li>')
                i += 1
                continue
            
            # 普通段落
            if in_list:
                html_lines.append('</ul>')
                in_list = False
            
            content = process_inline(line)
            html_lines.append(f'<p>{content}</p>')
            i += 1
        
        # 关闭未关闭的列表
        if in_list:
            html_lines.append('</ul>')
        
        return '\n'.join(html_lines)
    
    except Exception as e:
        print(f"Markdown 转换失败: {e}")
        # 失败时返回转义后的原文本
        return escape_html(markdown_text).replace('\n', '<br>')


def process_inline(text: str) -> str:
    """
    处理行内 Markdown 元素
    支持：行内代码、粗体、斜体、链接
    """
    # 先转义 HTML
    text = escape_html(text)
    
    # 行内代码（优先处理，避免被其他规则影响）
    text = re.sub(r'`([^`]+)`', r'<code class="inline-code">\1</code>', text)
    
    # 粗体
    text = re.sub(r'\*\*([^\*]+)\*\*', r'<strong>\1</strong>', text)
    text = re.sub(r'__([^_]+)__', r'<strong>\1</strong>', text)
    
    # 斜体
    text = re.sub(r'\*([^\*]+)\*', r'<em>\1</em>', text)
    text = re.sub(r'_([^_]+)_', r'<em>\1</em>', text)
    
    # 链接 [text](url)
    text = re.sub(r'\[([^\]]+)\]\(([^\)]+)\)', r'<a href="\2" target="_blank">\1</a>', text)
    
    return text


def extract_plain_text(html_text: str) -> str:
    """
    从 HTML 中提取纯文本（用于日志等场景）
    
    Args:
        html_text: HTML 字符串
        
    Returns:
        纯文本
    """
    # 移除 HTML 标签
    text = re.sub(r'<[^>]+>', '', html_text)
    # 解码 HTML 实体
    return html.unescape(text).strip()

